package com.springmvc.adapter;

import com.springmvc.RequestMappingInfo;
import com.springmvc.annotation.RequestParam;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Map;

/** 注解类型处理器适配器 */
@Component
public class AnnotationHandlerAdapter implements HandlerAdapter{

    @Override
    public boolean support(Object handler) {
        // 判断当前处理器类型是否为RequestMappingInfo注解类型
        return handler instanceof RequestMappingInfo;
    }

    @Override
    public Object handle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
        // 获取请求参数
        Map parameterMap = req.getParameterMap();
        RequestMappingInfo mappingInfo = (RequestMappingInfo) handler;
        // 获取执行方法
        Method method = mappingInfo.getMethod();
        // 获取方法参数列表
        Parameter[] parameters = method.getParameters();
        Object[] params = new Object[parameters.length];
        // 组装请求参数顺序
        for (int i=0; i < parameters.length; i++) {
            Parameter parameter = parameters[i];
            // 请求参数名
            String name = parameter.getAnnotation(RequestParam.class).value();
            // 参数值
            Object value = parameterMap.get(name);
            // 设置请求参数列表
            params[i] = value;
        }
        // 反射执行方法，获取执行结果
        return method.invoke(mappingInfo.getBean(), params);
    }

}
